package code15.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

public class TestBuffered {

	public static void main(String[] args) {
		//f1();
		
		//t1("src/code15/io/b.txt");
		
		//f2();
		
		t2("src/code15/io/b.txt");
	}

	private static void f2() {
		try (
				// 可以包装 一个 字符输出流, 为其添加额外的功能
				//PrintWriter pw = new PrintWriter(new FileWriter("src/code15/io/a4.txt"));
				// 可以一个字节流使用 默认字符集, 转换为字符流
				//PrintWriter pw = new PrintWriter(new FileOutputStream("src/code15/io/a4.txt"));
				// 根据路径/文件对象构建字符流, 使用 默认字符集
				//PrintWriter pw = new PrintWriter("src/code15/io/a4.txt");
				// 根据路径/文件对象构建字符流, 使用 指定的字符集
				PrintWriter pw = new PrintWriter("src/code15/io/a4.txt", "GBK");
			) {
			// 输出一个字符串
			pw.print("hello测试");
			// 只输出一个 换行符
			pw.println();
			// 输出一个字符串 + 换行符
			pw.println("world案例");
			
			// 刷新流
			pw.flush();
			System.out.println("over");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void f1() {
		try (
				BufferedReader br = new BufferedReader(
						new FileReader("src/code15/io/a.txt"));
				
				BufferedWriter bw = new BufferedWriter(
						new FileWriter("src/code15/io/a3.txt"));
				) {
			//int read = br.read();// 读一个字符, 读到文件末尾, 返回-1
			//int len = br.read(cbuf);// 读多个字节存入指定数组, 返回读取到的字节数, 读到文件末尾, 返回-1
			// 一次读取一行内容, 返回读取到内容(String), 如果 读到文件末尾, 返回 null
			// 会根据 换行符 进行内容分割, 所以一行的内容最后是没有 换行符 的
			// Windows的换行符是 \n\r, Linux/MacOS 换行符是 \n
			//String line = br.readLine();
			String line = null;
			while ( (line = br.readLine()) != null ) {
				// print 不会加 换行符
				//System.out.print(line);
				
				// 由于 文件内的换行符被 readLine 使用了, 
				// 要保证输出的内容和文件内容相同, 就需要自己加上 换行符
				System.out.print(line+'\n');
				
				// 不会加 换行符
				bw.write(line);
				// 输出一个 换行符
				bw.newLine();
			}
			// 建议执行
			bw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 删除指定文本文件中的 英文字母(不区分大小写)
	 * @param path
	 */
	public static void t1(String path) {
		ArrayList<String> list = new ArrayList<String>();
		try (
			BufferedReader br = new BufferedReader(
					new FileReader(path));
			) {
			
			String line = null;
			while ( (line = br.readLine()) != null) {
				// 去除其中的英文字母
				line = line.replaceAll("[a-zA-Z]", "");
				System.out.println(line);
				// 保存处理后的每一行内容
				list.add(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try (
				BufferedWriter bw = new BufferedWriter(
						new FileWriter(path));
			) {
			// 输出每一行的内容
			for (String line : list) {
				bw.write(line);
				bw.newLine();
			}
//			for (int i = 0; i < list.size(); i++) {
//				bw.write(list.get(i));
//				if ( i < list.size() - 1) {
//					bw.newLine();
//				}
//			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 把指定的 UTF-8字符集 保存的文本文件转存为 GBK字符集 保存的文本文件
	 * @param path UTF-8字符集 保存的文本文件路径
	 */
	public static void t2(String path) {
		ArrayList<String> list = new ArrayList<String>();
		try (
				BufferedReader br = new BufferedReader(new FileReader(path));
				) {
			String line = null;
			while ( ( line = br.readLine() ) != null ) {
				list.add(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try (
				PrintWriter pw = new PrintWriter(path, "GBK");
				) {
			for (String str : list) {
				pw.println(str);
			}
			pw.flush();
			System.out.println("转码成功");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	
}
